package data;

import java.util.HashMap;


import org.jdom.*;

import data.item.Item;
import data.list.Attributeslist;
import data.list.Datalist;
import data.list.Talentlist;

/**
 * Der Datamanager kuemmert sich um alle Daten. Er bietet Methoden
 * zum einlesen von XML-Dateien, erstellt aus dem Baum die passenden 
 * Listen und gibt die XML-Elemente weiter.
 * Er bietet ausserdem Methoden um an einzelne Listen in der Hashmap zu kommen 
 *
 * @author daishy
 * @date 10.03.2008 15:05:53
 *
 */
public class Datamanager
{
	/**
	 * HashMap fuer Listen (gespeichert nach ID)
	 */
	private HashMap<String, Datalist<? extends Item>> datalists;
	
	/**
	 * CTor. Erstellt HashMap
	 */
	public Datamanager()
	{
		this.datalists = new HashMap<String, Datalist<? extends Item>>(20);	
	}
	
	/**
	 * Die Methode durchlaeuft das uebergebene Document und
	 * ruft die passenden Methoden der jeweiligen Listen auf.
	 * Existiert noch keine Liste, so wird mit createDatalist
	 * eine neue erzeugt
	 * @param doc Das XML-Document
	 * @throws Dataexception 
	 * @throws IllegalStateException
	 */
	public void processXMLDocument(Document doc) throws Dataexception
	{	
		if(doc == null)
			throw new IllegalArgumentException("no null-values allowed");
		
		Element root = doc.getRootElement();
		
		// pruefen ob rootElement korrekt ist
		if(root.getText().compareToIgnoreCase("data") == 0)
			throw new Dataexception("Invalid XML-Structur");
		
		// alle Kinder durchgehen
		for(Object obj : root.getChildren())
		{
			Element e = (Element)obj;
			
			// Wenn Liste schon vorhanden, einfach Element uebergeben
			if(this.datalists.containsKey(e.getName()))
			{				
				((Datalist<? extends Item>)this.datalists.get(e.getName())).processXML(e);				
			}
			// sonst neue Liste erstellen und dann Elemente uebergeben
			else
			{
				Datalist<? extends Item> list = createDatalist(e.getName());
				list.processXML(e);
				
				this.datalists.put(e.getName(), list);
			}			
		}
	}

	public Datalist<? extends Item> createDatalist(String category)
	{		
		if(category.compareToIgnoreCase("attributes") == 0)
		{
			return new Attributeslist();
		}
		else if(category.compareToIgnoreCase("talents") == 0)
		{
			return new Talentlist();
		}
		
		throw new IllegalArgumentException("category not found!");
	}
	
	
	public Datalist<? extends Item> getList(String string)
	{
		return this.datalists.get(string);
		
	}
	
	/**
	 * Die Methode liefert die Stringdarstellung aller Datenlisten
	 * Die Methode wird hauptsaechlich zum Debuggen gebraucht.
	 */
	public String toString()
	{
		StringBuilder sb = new StringBuilder();
		
		for(Object o : this.datalists.values())
			sb.append(o.toString());
		return sb.toString();
	}
}
